// Package lockUtils
// @File: redisLock.go
// @Description:
// @Author: YaoRuiQi
// @Date: 2025/8/28 17:02

package redisLock

import (
	"fmt"
	"time"

	"github.com/go-redsync/redsync/v4"
	"github.com/go-redsync/redsync/v4/redis/goredis/v9"
	"github.com/redis/go-redis/v9"
	"go.uber.org/zap"
)

type RedisLockManager struct {
	Lock   *redsync.Redsync // redis锁
	Prefix string           // 前缀
}

var RedisLock *RedisLockManager

// InitRedisLock
//
//	@Description: 初始化redis锁
//	@param redisClient redis客户端
func InitRedisLock(logger *zap.Logger, redisClient *redis.Client, prefix string) error {
	pool := goredis.NewPool(redisClient)
	RedisLock = &RedisLockManager{
		Lock:   redsync.New(pool),
		Prefix: prefix,
	}

	// 探测：尝试获取并释放一次锁，确认连接正常
	mutex := RedisLock.Lock.NewMutex(
		RedisLock.GetCompleteLockKey("initTest"),
		redsync.WithExpiry(2*time.Second), // 锁超时时间
		redsync.WithTries(1),              // 只尝试一次
	)

	if err := mutex.Lock(); err != nil {
		return fmt.Errorf("初始化 Redis 分布式锁失败: %w", err)
	}
	if ok, err := mutex.Unlock(); !ok || err != nil {
		return fmt.Errorf("初始化 Redis 分布式锁解锁失败: %w", err)
	}

	logger.Info("Redis 分布式锁初始化成功")
	return nil
}

// GetCompleteLockKey
//
//	@Description: 获取补全的锁key
//	@param  key
//	@return string 补全的key
func (l *RedisLockManager) GetCompleteLockKey(key string) string {
	return fmt.Sprintf("%s:lock:%s", l.Prefix, key)
}
